#include<iostream>
#include<cstdio>
#include<string.h>
#include<iostream>
#include<algorithm>

using namespace std;
#define e 40100
char b[e];
/***************后缀数组模板*********************************/
int a[e],sa[e],container[e],wy[e],wv[e],wx[e],rrank[e],h[e];
int cmp(int *r,int a,int b,int l)
{
    return (r[a]==r[b])&&(r[a+l]==r[b+l]);
}
void suffix(int *r,int n,int *sa,int m)
{
    int i,j,*t,*x=wx, *y=wy,p;
    memset(container,0,sizeof(int)*m);
    for(i=0; i<n; i++)  container[x[i]=r[i]]++;
    for(i=1; i<m; i++)  container[i]+=container[i-1];
    for(i=n-1; i>=0; i--)   sa[--container[x[i]]]=i;
    for(p=0,j=1; p<n; j<<=1,m=p)
    {
        for(p=0,i=n-j; i<n; i++)    y[p++]=i;
        for(i=0; i<n; i++)  if(sa[i]>=j)    y[p++]=sa[i]-j;
        for(i=0; i<n; i++)  wv[i]=x[y[i]];
        memset(container,0,sizeof(int)*m);
        for(i=0; i<n; i++)  container[wv[i]]++;
        for(i=1; i<m; i++)  container[i]+=container[i-1];
        for(i=n-1; i>=0; i--)  sa[--container[wv[i]]]=y[i];
        for(t=x,x=y,y=t,x[sa[0]]=0,p=1, i=1; i<n; i++)
            x[sa[i]]=cmp(y,sa[i],sa[i-1],j)?p-1:p++;
    }


}
void cal(int *r,int *sa,int n)
{
    int i,j,k=0;
    for(i=1; i<=n; i++)  rrank[sa[i]]=i;
    for(i=0; i<n; h[rrank[i++]]=k)
        for(k?k--:0,j=sa[rrank[i]-1]; r[i+k]==r[j+k]; k++);

}
int fmax[e][20];
void makermq(int n)//rmq 问题模板
{
    int i,j,k;
    for(i=1; i<=n; i++)  fmax[i][0]=h[i];
    for(j=1; (1<<j)<=n; j++)
    {
        k=1<<(j-1);
        for(i=1; i+k<=n ;i++)
        {
            fmax[i][j]=min(fmax[i][j-1],fmax[i+k][j-1]);
        }
    }
}

int findmax(int q,int p)//查找rmq问题模板//lcp查找,q,p为原字符串上的标号
{
	int l,r ;
	l=rrank[q];
	r=rrank[p];
    int k=1;
    if(l>r)swap(l,r);
    l++;
    int dis=r-l+1;
    for(k=0; (1<<k)<=dis; k++);

        k--;

    int x=fmax[l][k];
    if(fmax[r-(1<<k)+1][k]<=x)return fmax[r-(1<<k)+1][k];
    return x;
}
/***************后缀数组模板*********************************/

int main()
{
     #ifndef ONLINE_JUDGE
     freopen("in.txt","r",stdin);
 #endif
    int n;int i;
    while(cin>>b)
    {
        n=strlen(b);
        int len= n*2;
        for(i=0; i<n; i++)
        {
            a[i]=a[len-i]=b[i];
        }
        a[n]=1;//这个字符要怎么处理
        len++;
        a[len]=0;
/***************后缀数组模板*********************************/
        suffix(a,len+1,sa,301);
		
        cal(a,sa,len);

        makermq(len);
/***************后缀数组模板*********************************/
        int maxx=-1;
        int q,r;int j;int flag=1;
        int ll=-1;
        for(i=0; i< n ;i++)
        {
		/***************后缀数组模板*********************************/
            r=findmax(i,2*n-i)-1;//lcp查找，传入要查找的两个在原字符串上的标号
		/***************后缀数组模板*********************************/
            if(ll<r*2+1)
            {
                ll=r*2+1;
                  maxx=r;
                  flag=1;
                  q=i;
            }
		/***************后缀数组模板*********************************/	
			r=findmax(i,2*n-i+1);//lcp查找,传入要查找的两个在原字符串上的标号
		/***************后缀数组模板*********************************/
            if(ll<r*2)
            {
                ll=r*2;
                  maxx=r;
                  flag=2;
                  q=i;
            }
        }
        if(flag==1)
        {
            for(i=q-maxx,j=0;j<maxx*2+1; j++,i++ )
                printf("%c",b[i]);cout<<endl;
        }
        else
        {
            for(i=q-maxx,j=0; j<maxx*2; j++,i++)
                printf("%c",b[i]);cout<<endl;

        }
    }
}